OpenStreetMapサーバを自作する(Install OpenStreetMap on AWS EC2/Ubuntu14.04)
下記エントリにて、TMS(Tableau Map Service)という仕組みを使い、Tableauから背景地図の設定を追加する為の手順をご紹介しました。
このエントリの最後で『アクセス負荷を掛け過ぎるとアク禁喰らうかもしれないので気を付けてね』的な文章を記載しましたが、TMSの対象リソースとなっている『OpenStreetMap』では代替策についても用意がなされていました。その手段の1つが『自前のOpenStreetMapサーバを用意する』です。(※下記リンクにその辺りの記載があります)
- Alternative OpenStreetMap Tile Providers / Tile usage policy - OpenStreetMap Wiki
- Heavy Users / API usage policy - OpenStreetMap Wiki
当エントリは、一般公開されているOpenStreetMapのサーバをTMSの接続先にするのでは無く、自前のOpenStreetMapサーバを構築し、そのサーバをTMSの接続先にする、という手順を解説する内容となります。
目次
- OpenStreetMapとは
- OpenStreetMapを利用する上での注意点
- OpenStreetMapを自前で用意する方法についての調査
- OpenStreetMapのインストール(AWS EC2/Ubuntu14.04)
- OSMデータのインポート
- OpenStreetMapサーバのブラウザ接続確認
- まとめ
OpenStreetMapとは
OpenStreetMapについては以下の情報をご参照ください。ざっくり言うと『GoogleMapみたいな地図をオープンライセンスの下、自由に利用出来るサービス』です。
OpenStreetMapを利用する上での注意点
同じタイミングで投稿した以下エントリでは、このOpenStreetMapを利用したTMSファイルを使い、背景地図の選択に新たなバリエーションを提供するための解説を行いました。ただ、OpenStreetMapを始めとするMapサービスは、無償で利用出来るものの、場合によっては高負荷をサーバに強いてしまう場合があり、その場合は提供元のサーバからアクセス禁止の制裁を受けてしまう可能性があります。
OpenStreetMapを自前で用意する方法についての調査
上記Wikiの『Tile Usage Policy』の欄に『Alternative OpenStreetMap Tile Providers』(代替のOpenStreetMap Tileプロバイダー)と称して以下の様な記載を発見。一番上の『switch2osm.org』というサイトで、Ubuntuベースの導入方法が紹介されているのでこれは使えそうだ!と調査を進める事にしました。
- Setting up your own tile server(独自のTile Serverを設定)
その他、世界各国でOpenStreetMapを自前で導入している資料を漁ってみた所、以下の様な情報が見つかりました。日本語での情報が幾つか見つかったのは嬉しいところです。
- Building a tile server from packages | switch2osm(Ubuntu12.04)
- OpenStreetMapデータを使って地図サーバを構築してみた | ビットログ(Ubuntu12.04)
- OpenStreetMapで地図タイルサーバーを構築する | 株式会社みどりの技術者ラボ
- OpenStreetMap 利用者ガイド 日本語版v1.0 リリース | OpenStreetMap Japan(Ubuntu10.04)
- Building an OpenStreetMap tile server on Ubuntu 12.04 LTS | Seshagiri(Ubuntu12.04)
- OpenStreetMapで独自レンダリングをしよう - Qiita(Ubuntu12.04)
上記リストの中でも特に一番下、nyampireさんのまとめたQiitaエントリの内容が素晴らし過ぎるクオリティでした。今回基本的にはこちらの内容をUbuntu14.04でほぼそのまま実行した(出来た)形になります。nyampireさん、ありがとうございます!
OpenStreetMapのインストール(AWS EC2/Ubuntu14.04)
直近、管理コンソールのEC2メニューから選択可能なUbuntuの最新バージョンのものを今回利用する事にしました。また、途中投入する事になるデータの範囲は日本国内のみとしました。その他スペック等はざっくり適当な感じで選んでいます。実際この辺は稼働状況を鑑みて設定を変えて行く事にはなると思います。
- AMI:Ubuntu Server 14.04 LTS (HVM), SSD Volume Type
- インスタンスタイプ:m3.xlarge
- ストレージ容量:200GiB
- セキュリティグループ:80(HTTP), 22(SSH)を必要なアクセス制御範囲で
EC2インスタンス起動を確認後、サーバにログインします。Ubuntuサーバへのデフォルトユーザのログインはec2-userでは無く、ubuntuとなる事に注意。
$ chmod 400 OpenStreetMap_key.pem $ ssh -i OpenStreetMap_key.pem ubuntu@xx.xxx.xxx.xxx Welcome to Ubuntu 14.04.2 LTS (GNU/Linux 3.13.0-48-generic x86_64) * Documentation: https://help.ubuntu.com/ System information as of Sat May 30 19:32:35 UTC 2015 System load: 0.0 Processes: 119 Usage of /: 0.4% of 196.73GB Users logged in: 0 Memory usage: 0% IP address for eth0: 10.x.x.xxx Swap usage: 0% Graph this data and manage this system at: https://landscape.canonical.com/ Get cloud support with Ubuntu Advantage Cloud Guest: http://www.ubuntu.com/business/services/cloud 0 packages can be updated. 0 updates are security updates. Last login: Sat May 30 19:32:38 2015 from xxxxxxxxxxxxxxxxx $
apt-getコマンドでパッケージ導入を行う際の情報をリポジトリに追加。こちらはQiitaで紹介されている様に、以下サイトから追加する内容を生成し、対象ファイルに追記します。
$ sudo vi /etc/apt/sources.list ---------- # (ファイル末尾に以下の2行を追記) deb http://ppa.launchpad.net/kakrueger/openstreetmap/ubuntu trusty main deb-src http://ppa.launchpad.net/kakrueger/openstreetmap/ubuntu trusty main
追記が完了したら以下コマンドを順次実行して行きます。
$ sudo apt-get install python-software-properties $ sudo add-apt-repository ppa:kakrueger/openstreetmap Press [ENTER] to continue or ctrl-c to cancel adding it ## 【Enter押下で先に進める】 $ sudo apt-get update $ sudo apt-get install libapache2-mod-tile
途中、以下の様にダイアログが表示され、決定・入力処理を促されます。基本的にここはデフォルト指定のまま進めます。YES or NOは全てYES。
データベース名はデフォルトのgis。
DBアクセスユーザー名もデフォルトのwww-dataで。
このくだりは最後に以下の様なメッセージが出ていればOKです。
: * Restarting web server apache2 [Sat May 30 19:39:30.437421 2015] [tile:notice] [pid 6116:tid 139659681163136] Loading tile config default at /osm/ for zooms 0 - 20 from tile directory /var/lib/mod_tile with extension .png and mime type image/png [ OK ] Processing triggers for libc-bin (2.19-0ubuntu6.6) ... $
OSMデータのインポート
上記処理までで、環境自体は整いました。次に、環境に投入するデータを用意します。
OpenStreetMapは全世界の地図を対象としていますので、投入データも最大規模のものは当然全世界が対象となります。以下公式サイトで公開されている『Latest Weekly Planet File』の容量は何と38GB。ファイル名もPlanet(惑星)と来たもんだ。ただ、全世界を対象にすると半端無く時間が掛かるので今回は日本国内のデータのみに留めておこうと思います。
データダウンロードの際は上記サイトは負荷の都合上避けるように、とあるので先のQiitaのエントリ同様、下記サイトからデータをダウンロードする事に。
ダウンロード実行。とは言え日本国内だけでも900MB超。結構ボリュームありますね。
$ wget http://download.geofabrik.de/asia/japan-latest.osm.pbf $ ls -lta *.pbf -rw-rw-r-- 1 ubuntu ubuntu 959104312 May 30 00:51 japan-latest.osm.pbf
いよいよデータのインポート。...と思ったらエラーが出ます。
$ osm2pgsql --slim -C 1500 japan-latest.osm.pbf osm2pgsql SVN version 0.85.0 (64bit id space) Error: Connection to database failed: FATAL: role "ubuntu" does not exist
『エラーが出るようならこのコマンドを実行すべし』と手順にもあるので、指定の内容でコマンドを実行します。後半エラーが出てますがここでは気にしなくてOK。
$ sudo /usr/bin/install-postgis-osm-user.sh gis ubuntu Granting rights to user 'ubuntu' GRANT GRANT GRANT ERROR: relation "planet_osm_line" does not exist ERROR: relation "planet_osm_nodes" does not exist ERROR: relation "planet_osm_point" does not exist ERROR: relation "planet_osm_rels" does not exist ERROR: relation "planet_osm_roads" does not exist ERROR: relation "planet_osm_ways" does not exist ERROR: relation "planet_osm_polygon" does not exist $
再度コマンド実行。今回の環境ではおよそ50分程掛かりました。コマンド実行後は休憩してるか別のタスクに取り掛かるなどして時間を有効活用しといてください。Osm2pgsql took XXXXs overallの様なコマンドが出たら投入完了です。
$ time osm2pgsql --slim -C 1500 japan-latest.osm.pbf : : Sorting data and creating indexes for planet_osm_roads Stopping table: planet_osm_rels Building index on table: planet_osm_rels (fastupdate=off) Stopping table: planet_osm_ways Building index on table: planet_osm_ways (fastupdate=off) Stopping table: planet_osm_nodes Stopped table: planet_osm_nodes in 0s Analyzing planet_osm_polygon finished Analyzing planet_osm_point finished Analyzing planet_osm_roads finished Analyzing planet_osm_line finished Stopped table: planet_osm_rels in 5s Copying planet_osm_point to cluster by geometry finished Creating geometry index on planet_osm_point Creating osm_id index on planet_osm_point Creating indexes on planet_osm_point finished All indexes on planet_osm_point created in 85s Completed planet_osm_point Copying planet_osm_roads to cluster by geometry finished Creating geometry index on planet_osm_roads Creating osm_id index on planet_osm_roads Creating indexes on planet_osm_roads finished All indexes on planet_osm_roads created in 140s Completed planet_osm_roads Copying planet_osm_polygon to cluster by geometry finished Creating geometry index on planet_osm_polygon Copying planet_osm_line to cluster by geometry finished Creating geometry index on planet_osm_line Creating osm_id index on planet_osm_polygon Creating indexes on planet_osm_polygon finished All indexes on planet_osm_polygon created in 432s Completed planet_osm_polygon Creating osm_id index on planet_osm_line Creating indexes on planet_osm_line finished All indexes on planet_osm_line created in 711s Completed planet_osm_line Stopped table: planet_osm_ways in 847s Osm2pgsql took 3117s overall real 51m56.263s user 24m36.932s sys 0m55.809s $
構築手順で作成したユーザー: www-data用にも以下のコマンドを実行しておきます。
$ sudo /usr/bin/install-postgis-osm-user.sh gis www-data Granting rights to user 'www-data' GRANT GRANT GRANT GRANT GRANT GRANT GRANT GRANT GRANT GRANT $
renderdを再起動し、
$ sudo /etc/init.d/renderd restart * Restarting Mapnik rendering daemon renderd [ OK ] $
対象となるHTMLファイルを一部編集。QiitaではHTMLのホスト名を変更していましたが、今回のケースではそこは編集する必要が無く(相対パスになっていました)、以下の初期表示位置指定を書き換えました。
$ sudo vi /var/www/osm/slippymap.html ------- // Start position for the map (hardcoded here for simplicity) // 東京の辺りを指定 var lat=35.685; var lon=139.745; var zoom=11;
また併せて、以下設定行の部分、インストールで用いたEC2サーバのIPアドレス(やホスト名)を追記した形に変更しておきます。
// This is the layer that uses the locally stored tiles //var newLayer = new OpenLayers.Layer.OSM("Local Tiles", "${z}/${x}/${y}.png", {numZoomLevels: 19}); var newLayer = new OpenLayers.Layer.OSM("Local Tiles", "http://xxx.xxx.xxx.xxx/osm/${z}/${x}/${y}.png", {numZoomLevels: 19}); map.addLayer(newLayer);
OpenStreetMapサーバのブラウザ接続確認
http://接続先サーバー/osm/slippymap.htmlにアクセス。すると、以下の様にEC2上でOpenStreetMapを稼働させる事が出来ました。デベロッパーツールでアクセスしているURLを確認してみると、参照先のサーバが所定のEC2サーバを向いている事が確認出来ました。(※モザイク掛けちゃってますが)
ここで確認した情報を元に、下記エントリで作成したTMSファイルを元に、EC2にインストールしたOpenStreetMapを参照させるTMSファイルを作成します。
<?xml version="1.0" encoding="utf-8"?> <mapsource inline="true" version="8.1"> <connection class="OpenStreetMap" port="80" server="http://xxx.xxx.xxx.xxx/" url-format="/osm/{Z}/{X}/{Y}.png" /> <layers> <layer display-name='Base' name='base' show-ui='false' type='features' request-string='/' /> </layers> </mapsource>
上記作成ファイルを所定の場所に配置後、Tableau Desktopを再起動。新しく追加したTMSファイルをバックグラウンドマップとして指定すると、ちゃんと読み込んでくれました!
まとめ
以上、OpenStreetMap自作に関する手順のご紹介でした。これで一応、自作したサーバーにアクセスが行くようになったのですが、実際アクセスしてみるとサーバのレスポンスであったり、Tile情報(OpenStreetMapの地図情報を表示する画像情報)の有無によって上手く地図が表示されない状況でした。これを解決する手段として『あらかじめTile情報をダウンロードして用意しておく』というものがあるようなので、別途エントリとしてその辺りについて進めてみようと思います。こちらからは以上です。